home *** CD-ROM | disk | FTP | other *** search
- /*--------------------------------------------------------------------------*\
- | TESS.C |
- \*--------------------------------------------------------------------------*/
-
- /*
- Beyond The Tesseract V2.03 (C) 1990 David Lo
-
- TRS-80
- 1.0 : 05/29/83 :
- 1.7 : 03/16/86 :
-
- MS-DOS
- 2.0 : 10/01/88 :
- 2.01 : 03/ /89 :
- 2.02 : 10/04/89 : Fixed probability message,
- Got rid of title screen when game ends.
- 2.03 : 01/22/90 : Added hint for field puzzle.
- : 02/05/90 : "look" without noun will finally print the current room.
- */
-
- #include <ctype.h>
- #include <string.h>
- #include <stdio.h>
-
- #include "adv-def.h"
- #include "parser.h"
- #include "tess-def.h"
-
- /*------------------------------------------------------------*/
- /* on some PC clones (e.g. mine), scrolling the screen when printing a '\n'
- with the conio.h routines (e.g. putch('\n') or cprintf('\n')) is much slower
- than the stdio.h routines.
- */
- nl() { putchar('\n'); }
-
- /*----------------------------*/
- /* if tty-mode, then using standard library functions for I/O, and ignore the
- screen I/O functions
- */
- #ifdef tty
-
- #define cprintf printf
- #define cputs printf
- #define prints puts
-
- #define clrscr()
- #define clreol()
- #define gotoxy(x,y)
-
- /* if non-tty-mode, use console IO library
- */
- #else
-
- #include <conio.h>
-
- prints( char *s )
- {
- cputs( s );
- nl();
- }
-
- #endif
-
- /*----------------------------*/
- int get_enter()
- {
- int i=0, ch;
-
- while ((ch=getchar()) != '\n')
- i+=ch;
- return (i);
- }
-
- /*----------------------------*/
- /* enter aux. object (e.g. Give XXX to AUX)
- */
- int InputNoun( char *prompt, char *noun )
- {
- int nn;
-
- cprintf( prompt );
- gets( noun );
- nn = GetNounNum( noun );
- resize_word( noun );
- return( nn );
- }
-
- /*------------------------------------------------------------*/
- /* Adventure dependent stuff
- */
-
- int
- print_room, /* flag for updating room after command */
-
- curr_loc, /* current location */
- curr_lev, /* current level */
- level_loc [ 4 ], /* current location for diff. levels */
- zap, /* flag set when game over */
- /* 1=quit 2=wrong password 3=right password */
-
- sleep_lev, /* which level player was in when sleeping */
-
- /* flags are 0=false/haven't done, 1=true/done */
- /* unless otherwise noted */
-
- cc, /* coil status: 0=normal b1=cooled b2=magnetized */
- wa, /* water alien */
- ep, /* eat pills */
- dr, /* dice roll counter */
- af, /* audio filter inserted */
- gp, /* get password */
- mi, /* message: bits 0,1,2,3 = parts found */
- ti, /* think idea */
- kp, /* kick projector */
-
- dc [ 3 ], /* each dice roll, dc[i]<33 */
- sum /* sum = sigma( dc ) < 100 */
- ;
-
- /*----------------------------*/
- InitAdv()
- {
- int i;
-
- for ( i=1; i<MaxObjs; i++ )
- {
- obj[i].loc = obj[i].init_loc;
- }
-
- level_loc[1] = 2;
- level_loc[2] = 25;
- level_loc[3] = 29;
-
- curr_lev = 1;
- curr_loc = level_loc [ curr_lev ];
-
- zap = cc = wa = ep = dr = af = gp = mi = ti = kp = 0;
-
- for ( sum=0, i=0; i<3; i++ )
- sum += (dc [i] = rand() & 31);
-
- print_room = 1;
- }
-
- /*------------------------------------------------------------*/
- /* Message routines
- */
-
- /*----------------------------*/
- PrintMess( int i )
- {
- switch ( i )
- {
- case 1: prints("Nothing special happens."); break;
- case 2: prints("That isn't possible."); break;
- case 3: prints("Doesn't work."); break;
- case 4: prints("Can't do that yet."); break;
- case 5: prints("OK."); break;
- case 6: prints("How?"); break;
- case 7: cprintf("You have nothing to %s with.", cmd.verb ); nl(); break;
- }
- }
-
- not_happen() { PrintMess( 1 ); }
- not_poss() { PrintMess( 2 ); }
- not_work() { PrintMess( 3 ); }
- not_yet() { PrintMess( 4 ); }
- ok() { PrintMess( 5 ); }
- how() { PrintMess( 6 ); }
-
- /*------------------------------------------------------------*/
- /* Object routines
- */
-
- /*----------------------------*/
- int CheckObjAttr( int nn, int mask )
- {
- return ( obj [nn].attr & mask );
- }
-
- #define CanGetObj(i) CheckObjAttr((i),1)
- #define CanLookObj(i) CheckObjAttr((i),4)
-
- /*----------------------------*/
- CarryObj( int nn )
- {
- obj [nn].loc = -curr_lev;
- }
-
- int CarryingObj( int nn )
- {
- return ( obj [nn].loc == -curr_lev );
- }
-
- /*----------------------------*/
- WearObj( int nn )
- {
- obj [nn].loc = -curr_lev - 3;
- }
-
- int WearingObj( int nn )
- {
- return ( obj [nn].loc == -curr_lev-3 );
- }
-
- /*----------------------------*/
- int ObjOnPlayer( int nn )
- {
- return ( CarryingObj(nn) || WearingObj(nn) );
- }
-
- /*----------------------------*/
- DropObj( int nn )
- {
- obj [nn].loc = curr_loc;
- }
-
- int ObjInRoom( int nn )
- {
- return ( obj [nn].loc == curr_loc );
- }
-
- /*----------------------------*/
- JunkObj( int nn )
- {
- obj [nn].loc = 0;
- }
-
- /* replace object nn with object new_nn
- */
- ReplaceObj( int nn, int new_nn )
- {
- obj [new_nn].loc = obj [nn].loc;
- obj [nn].loc = 0;
- }
-
- /*----------------------------*/
- /* See if an object is accessible. This means the object is being
- carried/worn, is in the same room, is a concept noun (e.g. north),
- is part of the room (e.g. field), or is part of another object
- (e.g. button).
- */
- int ObjIsPresent( int nn )
- {
- if ( (nn>=o_north) && (nn<=o_invent) ) /* direction, "inventory" */
- return (1); /* always available */
-
- else if ( (nn>=o_buttons) && (nn<=o_four) ) /* buttons */
- return ( ObjIsPresent(o_proj) ); /* on projector */
-
- else if ( (nn==o_liquid) && (obj[nn].loc==-8) ) /* contained fluid */
- return ( ObjIsPresent(o_bottle) ); /* in Klein bottle */
-
- else
- return ( ObjInRoom(nn) || CarryingObj(nn) || WearingObj(nn) );
- }
-
- /*------------------------------------------------------------*/
- /* Room routines
- */
-
- /*----------------------------*/
- /* predicates to return check whether the player in in a certain world
- */
- int InComplex( int rn )
- {
- return ( rn==1 || rn==2 || rn==7 || rn==8 );
- }
-
- int InMirrorWorld( int rn )
- {
- return ( rn==4 || (rn>=9 && rn<=13) );
- }
-
- int InMathWorld( int rn )
- {
- return ( rn==3 || rn==5 || (rn>=14 && rn<=17) );
- }
-
- int InSpectralWorld( int rn )
- {
- return ( rn==6 || (rn>=18 && rn<=22) );
- }
-
- int InDreamWorld( int rn )
- {
- return ( curr_lev==2 || (rn>=23 && rn<=28) || rn==35 );
- }
-
- int InBookWorld( int rn )
- {
- return ( curr_lev==3 || (rn>=29 && rn<=34) );
- }
-
- /*----------------------------*/
- PrintCurrRoom()
- {
- static int stop_line=1;
- int i,flag, len,currx;
- char *s;
-
- #ifndef tty
- /* clear window area from previous time
- */
- for ( i=stop_line; i>=1; i-- )
- {
- gotoxy( 1, i );
- clreol();
- }
- #else
- cprintf("------------------------------------------------------------------------------");
- nl();
- #endif
-
- cprintf("You are %s.", room [ curr_loc ].name ); nl();
-
- prints("You see around you:");
- clreol();
- flag=0;
- currx=0;
- for ( i=1; i<MaxObjs; i++ )
- if (ObjInRoom(i))
- {
- s = obj[i].name;
- len = strlen(s);
- if (currx+ len + 3 > 78 ) { currx=0; nl(); clreol(); }
- cprintf(" %s.", s );
- currx += len+3;
- flag=1;
- }
- if (!flag)
- prints(" Nothing special.");
- else
- { nl(); clreol(); }
-
- prints("Exits:");
- clreol();
- flag=0;
- for ( i=0; i<MaxDirs; i++ )
- if ( room [curr_loc].link [i] )
- {
- cprintf(" %s.", obj[i+1].name );
- flag=1;
- }
- if (!flag) cprintf(" none.");
- nl();
-
- #ifdef tty
- nl();
- #else
- prints("------------------------------------------------------------------------------");
- stop_line = wherey(); /* stop line is the line after the separator bar */
- gotoxy( 1,25 );
- #endif
- }
-
- /*----------------------------*/
- goto_new_lev( int lev )
- {
- curr_lev = lev;
- curr_loc = level_loc [curr_lev];
- }
-
- goto_new_loc( int rn )
- {
- curr_loc = rn;
- level_loc [curr_lev] = curr_loc;
- }
-
- /*------------------------------------------------------------*/
- /* Verb routines
- */
-
- /*----------------------------*/
- do_go()
- {
- int direct, new_room;
-
- switch ( cmd.nn )
- {
- case o_north:
- case o_east:
- case o_south:
- case o_west:
- direct = cmd.nn - 1; /* assumes NESW = 1234 */
- new_room = room [curr_loc].link [direct];
- if (new_room)
- {
- goto_new_loc( new_room );
- print_room = 1;
- }
- else
- prints("Can't go in that direction");
- break;
-
- default:
- /*
- if (isdigit(cmd.noun[0]))
- {
- new_room = atoi( cmd.noun );
- if ( (new_room>=0) && (new_room<MaxLocs) )
- goto_new_loc( new_room );
- else
- prints("Can't go there");
- }
- else
- */
- prints("Use a direction or the stack");
- }
- }
-
- /*----------------------------*/
- do_dir()
- {
- cmd.nn = cmd.vn;
- cmd.vn = 6;
- do_go();
- }
-
- /*----------------------------*/
- do_inv()
- {
- int flag, i, len,currx;
- char s[80];
-
- prints("You are carrying:");
- flag=0;
- currx=0;
- for ( i=1; i<MaxObjs; i++ )
- if ( ObjOnPlayer(i) )
- {
- strcpy( s, obj[i].name );
- if (WearingObj(i)) strcat( s, " (wearing)" );
- len = strlen(s);
- if (currx+ len + 3 > 78 ) { currx=0; nl(); }
- cprintf(" %s.", s );
- currx += len+3;
- flag=1;
- }
-
- if (!flag)
- prints(" nothing.");
- else
- nl();
- }
-
- /*----------------------------*/
- do_get()
- {
- int where, attr, i, get_flag;
- char s[16], *p;
-
- if (ObjOnPlayer(cmd.nn))
- prints("You already have it.");
-
- else if (cmd.nn==o_invent) /* get everything in room */
- {
- for ( i=o_invent+1; i<MaxObjs; i++ )
- if ( ObjInRoom(i) && CanGetObj(i) )
- {
- cmd.nn=i;
- cprintf( "--> get %s", obj[i].name ); nl();
- do_get();
- }
- }
-
- else if (!CanGetObj(cmd.nn)) /* un-gettable object? */
- {
- if (cmd.nn==o_plant) /* alien */
- prints("The being is rooted in the 4th dimension.");
-
- else if (cmd.nn==o_group)
- prints("The group has infinitely many reasons to stay where it is.");
-
- else if (cmd.nn==o_fluid) /* fluid */
- prints("It's too cold!");
-
- else
- prints("Can't get that.");
- }
-
- else /* gettable object */
- {
- get_flag = 1;
-
- if (cmd.nn==o_liquid) /* 4-D liquid */
- {
- how();
- get_flag = 0;
- }
-
- else if (cmd.nn==o_plasma) /* plasma */
- {
- if (!CarryingObj(o_coil) || (cc!=3)) /* not have coil or not mag. bottle */
- {
- prints("Too hot to handle.");
- get_flag = 0;
- }
- else
- prints( "The magnetic field of the coil contained the plasma." );
- }
-
- else if (cmd.nn==o_improb) /* improbability */
- {
- get_flag = 0;
- cprintf("What is the probability of getting this improbability? ");
- gets( s );
- p = strchr( s, '.' ); /* skip past decimal point */
- if (!p)
- printf("Probabilites are values between 0 and 1.\n");
- else
- {
- p++;
- i = atoi( p );
- if (i!=sum && i*10!=sum)
- prints("Wrong.");
- else
- get_flag = 1;
- }
- }
-
- if (get_flag)
- {
- CarryObj( cmd.nn );
- ok();
- }
- }
- }
-
- /*----------------------------*/
- do_drop()
- {
- int where, i;
-
- if (ObjInRoom(cmd.nn))
- prints("It's already here.");
-
- else if (cmd.nn==o_improb && curr_loc==16)
- do_throw();
-
- else if (cmd.nn==o_invent) /* drop everything */
- {
- for ( i=o_invent+1; i<MaxObjs; i++ )
- if ( ObjOnPlayer(i) )
- {
- cmd.nn=i;
- cprintf( "--> drop %s", obj[i].name ); nl();
- do_drop();
- }
- }
-
- else if (cmd.nn>o_invent)
- {
- if (cmd.nn==o_coil) /* drop coil, check for plasma as well */
- {
- if (CarryingObj(o_coil) && CarryingObj(o_plasma))
- DropObj( o_plasma );
- }
-
- if ( ObjOnPlayer( cmd.nn ))
- {
- DropObj(cmd.nn);
- ok();
- }
- }
- }
-
- /*----------------------------*/
- do_throw()
- {
- char *s;
-
- if (ObjInRoom(cmd.nn))
- prints("It's already here.");
-
- else if (cmd.nn==o_improb && curr_loc==16)
- {
- prints("The improbability's presence warps the fabric of the field.");
- room [16].link [east] = 17 - room [16].link [east];
- print_room = 1;
- DropObj( cmd.nn );
- }
- else if (cmd.nn==o_cube)
- do_roll();
-
- else if (cmd.nn==o_disk)
- {
- prints("With great skill (i.e. luck) you threw the disk into the next room.");
- if (curr_loc==29)
- obj [cmd.nn].loc = -7;
- else
- obj [cmd.nn].loc = room [curr_loc].link [south];
- }
-
- else
- do_drop();
- }
-
- /*----------------------------*/
- do_break()
- {
- if (cmd.nn==o_prism)
- {
- prints("The prism shatters along the lines and mysteriously");
- prints("reorganizes itself into a tetrahedron.");
- ReplaceObj( cmd.nn, o_tetra );
- }
-
- else if (cmd.nn==o_tetra)
- prints("It shatters, but quickly reforms itself.");
-
- else if (cmd.nn==o_zeta)
- do_solve();
-
- else if (cmd.nn==o_proj)
- {
- if (!kp)
- {
- prints("With a few kicks and blows, both you and the projector felt better.");
- kp = 1;
- }
- else
- prints("Better not try that again, or you'll really break it.");
- }
-
- else if (cmd.nn==o_bottle)
- do_cut();
-
- else
- prints("Violence is not necessary, most of the time.");
- }
-
- /*----------------------------*/
- do_look()
- {
- if (!cmd.nn)
- print_room = 1;
-
- else if (!CanLookObj(cmd.nn))
- {
- cprintf("Looks like %s.", obj[cmd.nn].name ); nl();
- }
-
- else
- switch ( cmd.nn )
- {
- case o_mirror:
- prints("You see the reflections of a mirror world.");
- break;
-
- case o_crt:
- prints("You see the images of a mathematical universe.");
- break;
-
- case o_group:
- prints("The group consists of converging parallel lines, alef-null,");
- prints("the last prime number, 1/0, and uncountably many others.");
- break;
-
- case o_hole:
- prints("You see the lights of an electromagnetic continuum.");
- break;
-
- case o_proj:
- prints("You see a wide slot and 5 buttons.");
- if (obj[o_disk].loc==-7)
- prints("A disk is in the projector.");
-
- case o_buttons:
- prints("The buttons are labelled zero to four.");
- break;
-
- case o_chaos:
- prints("It bears a slight resemblence to the current universe.");
- break;
-
- case o_dust:
- prints("It look like the remains of an exploded Julia set.");
- break;
-
- case o_flake:
- prints("It doesn't look like the coastline of Britain.");
- break;
-
- case o_mount:
- prints("It looks the same at all scales.");
- break;
-
- case o_tomb:
- prints("The epitaph reads: The Eternal Soul");
- mi = mi | 1;
- break;
-
- case o_stack:
- prints("It's a Space-Time Activated Continuum Key.");
- break;
-
- case o_audio:
- prints("Looks like 2 speakers connected by a band.");
- if (!af)
- prints("There is a groove in the band.");
- break;
-
- case o_book:
- prints("The title is 'Interactive Adventures'.");
- break;
-
- case o_bottle:
- if (obj[o_liquid].loc==-8)
- prints("It is full of some strange liquid.");
- else
- prints("It is an empty bottle with no inside or outside.");
- break;
-
- case o_prism:
- prints("You see flashes along deeply etched lines");
- if (curr_loc==21)
- prints("And embedded, distorted shapes resembling letters");
- break;
-
- case o_appa:
- prints("Looks like a device used for increasing the dimensions of");
- prints("geometric and topological objects.");
- break;
-
- case o_improb:
- prints("It looks like a heart of gold.");
- break;
-
- case o_zeta:
- prints("It's a very vicious-looking integral.");
- break;
-
- case o_cube:
- prints("There are numbers on the sides.");
- break;
-
- case o_coil:
- prints("The ends of the coil are connected to form a loop.");
- break;
-
- case o_sing:
- prints("It is shaped like a narrow band.");
- break;
-
- case o_disk:
- prints("The title is: The Science and Beauty of a Geometric Nature");
- break;
-
- case o_supp:
- prints("It's an almost obvious fact.");
- prints("It is not proven.");
- break;
-
- case o_hypo:
- prints("It's a complicated statement.");
- prints("It is not proven.");
- break;
-
- case o_lemma:
- prints("It's a rather specialized fact.");
- break;
-
- case o_theorem:
- prints("It begins: The metaphysical existentialism of reality ...");
- prints("The rest is incomprehensible to you.");
- break;
-
- case o_axiom:
- prints("It's the basis of a complex system.");
- break;
-
- case o_post:
- prints("It's a basic fact.");
- break;
-
- case o_math:
- prints("He looks almost asleep.");
- break;
-
- case o_tetra:
- if (curr_loc==22)
- {
- prints("Sharp letters form the message: Seeks the Exact");
- mi = mi | 2;
- }
- else
- prints("You see colorless letters.");
- break;
-
- case o_func:
- prints("The function has many sharp points, all of which are at (1/2+bi).");
- break;
-
- case o_idea:
- prints("The idea is very vague and not fully developed.");
- break;
-
- case o_contra:
- prints("It is true and false, but neither is correct, and both are right.");
- break;
-
- case o_warr:
- prints("It has expired.");
- break;
-
- default:
- cprintf("Looks like %s.", obj[cmd.nn].name ); nl();
- }
- }
-
- /*----------------------------*/
- do_read()
- {
- if (cmd.nn==o_book)
- {
- prints("You are now reading an adventure ...");
- goto_new_lev( 3 );
- print_room = 1;
- }
- else
- do_look();
- }
-
- /*----------------------------*/
- do_use()
- {
- switch ( cmd.nn )
- {
- case o_proj:
- prints("Try the buttons.");
- break;
-
- case o_stack:
- prints("Try push or pop the stack, or scan something with it.");
- break;
-
- case o_prism:
- do_look();
- break;
-
- case o_appa:
- prints("Try to _y_ something with it");
- break;
-
- case o_improb:
- if (curr_loc==16) do_throw(); else how();
- break;
-
- case o_func:
- prints("");
- break;
-
- case o_zeta:
- prints("");
- break;
-
- default:
- how();
- break;
- }
- }
-
- /*----------------------------*/
- do_touch()
- {
- cprintf( "Feels just like a %s.", cmd.noun ); nl();
- }
-
- /*----------------------------*/
- do_swing()
- {
- if (cmd.nn==o_coil)
- do_spin();
- else
- not_happen();
- }
-
- /*----------------------------*/
- do_rub()
- {
- do_touch();
- }
-
- /*----------------------------*/
- do_push()
- {
- int new_room;
-
- if (cmd.nn==o_stack)
- {
- if (curr_loc>3)
- not_happen();
- else if (gp)
- do_scan();
- else
- {
- prints("You are falling inwards ...");
- goto_new_loc( curr_loc+3 );
- print_room = 1;
- }
- }
-
- else if (obj[cmd.nn].loc==-7)
- {
- if (obj[o_disk].loc!=-7)
- not_happen();
- else if (!kp)
- prints("The projector begins to start, fizzes and grinds, then stops.");
- else
- {
- clrscr();
- gotoxy( 1,25 );
- prints("The lights dimmed for a while.");
- new_room = cmd.nn + 17;
- goto_new_loc( new_room );
- room [29].link [north] = curr_loc;
- print_room = 1;
- DropObj( o_proj );
-
- if (new_room==30)
- {
- prints("The projector ejects the disk.");
- DropObj( o_disk );
- }
- }
- }
-
- else
- not_happen();
- }
-
- /*----------------------------*/
- do_pop()
- {
- char *s;
-
- s = "You are falling outwards ...";
-
- if (gp)
- do_scan();
-
- else if (cmd.nn==o_pills)
- do_eat();
-
- else if (cmd.nn!=o_stack)
- not_poss();
-
- else if (InComplex( curr_loc ))
- prints("Can't transcend reality in this adventure.");
-
- else if (InMirrorWorld( curr_loc ))
- {
- goto_new_loc( 1 );
- print_room = 1;
- prints( s );
- }
-
- else if (InMathWorld( curr_loc ))
- {
- goto_new_loc( 2 );
- print_room = 1;
- prints( s );
- }
-
- else if (InSpectralWorld( curr_loc ))
- {
- goto_new_loc( 3 );
- print_room = 1;
- prints( s );
- }
-
- else
- not_happen();
- }
-
- /*----------------------------*/
- do_spin()
- {
- if (cmd.nn==o_coil)
- {
- if (curr_loc==18)
- {
- cc = cc | 2;
- ok();
- }
- else
- not_happen();
- }
-
- else
- not_happen();
- }
-
- /*----------------------------*/
- do_roll()
- {
- int n;
-
- if (cmd.nn==o_cube)
- {
- n = dr % 4;
- cprintf("You rolled a ");
- if (n<3)
- {
- if (dc[n]<10)
- cprintf(".0%d", dc[n]);
- else
- cprintf(".%d", dc[n]);
- }
- else
- cprintf("+nnn");
- nl();
- dr++;
- }
- else
- not_happen();
- }
-
- /*----------------------------*/
- do_wear()
- {
- if (WearingObj(cmd.nn))
- prints("You're already wearing it.");
-
- else if (cmd.nn==o_audio)
- {
- WearObj( cmd.nn );
- ok();
- }
-
- else
- not_poss();
- }
-
- /*----------------------------*/
- do_eat()
- {
- if (cmd.nn==o_plant)
- prints("Don't consume higher lifeforms.");
-
- else if (cmd.nn==o_pills)
- {
- prints("Gulp! Suddenly you feel a little drowsy.");
- ep=1;
- JunkObj( cmd.nn );
- }
-
- else
- prints("Can't eat that.");
- }
-
- /*----------------------------*/
- do_taste()
- {
- switch ( cmd.nn )
- {
- case o_pills:
- prints("It tastes like a drug.");
- break;
-
- case o_solid:
- case o_liquid:
- prints("The taste is quite orthogonal.");
- break;
-
- default:
- prints("Can't taste that.");
- break;
- }
- }
-
- /*----------------------------*/
- do_drink()
- {
- if (cmd.nn==o_fluid)
- prints("Too cold.");
-
- else if (cmd.nn==o_liquid)
- prints("You're too low dimensioned to drink it.");
-
- else
- prints("Can't drink that.");
- }
-
- /*----------------------------*/
- do_remove()
- {
- if (!WearingObj(cmd.nn))
- prints("You are not wearing it.");
-
- else
- {
- CarryObj( cmd.nn );
- ok();
- }
- }
-
- /*----------------------------*/
- do_water()
- {
- if ( !ObjIsPresent(o_liquid) &&
- (!CarryingObj(o_bottle) || obj[o_liquid].loc!=-8) )
- prints("Nothing to water with.");
-
- else if (cmd.nn!=o_plant)
- prints("Can't water that.");
-
- else
- {
- prints("Dendrites appear from hyperspace and absorbed the liquid.");
- prints("The being thanks you.");
- wa = 1;
- JunkObj( o_liquid );
- }
- }
-
- /*----------------------------*/
- do_fill()
- {
- if (cmd.nn==o_bottle)
- {
- if (curr_loc==obj[o_liquid].loc)
- {
- obj[o_liquid].loc = -8;
- ok();
- }
- else if (curr_loc==obj[o_fluid].loc)
- prints("The fluid flows in and then flows out by itself");
- else
- not_yet();
- }
-
- else
- how();
- }
-
- /*----------------------------*/
- do_pour()
- {
- if (cmd.nn==o_bottle || cmd.nn==o_liquid)
- {
- if (obj[o_liquid].loc!=-8)
- prints("Nothing to pour.");
-
- else if (curr_loc==obj[o_plant].loc)
- {
- cmd.nn=o_plant;
- do_water();
- }
-
- else
- {
- DropObj( o_liquid );
- ok();
- }
- }
-
- else
- not_work();
- }
-
- /*----------------------------*/
- do_freeze()
- {
- if (curr_loc!=obj[o_fluid].loc)
- not_yet();
-
- else if (cmd.nn==o_coil)
- {
- cc = cc | 1;
- ok();
- }
-
- else
- prints("You might damage it.");
-
- }
-
- /*----------------------------*/
- do_melt()
- {
- if (!ObjIsPresent(o_plasma))
- not_yet();
-
- else if (cmd.nn==o_solid)
- {
- prints("The plasma dissipates as the solid melts into a puddle of liquid.");
- JunkObj( o_plasma );
- JunkObj( o_solid );
- DropObj( o_liquid );
- if (curr_loc==obj[o_plant].loc)
- {
- cmd.nn=o_plant;
- do_water();
- }
- }
-
- else if (cmd.nn==o_tetra)
- prints("It melts, but quickly recrystalizes.");
-
- else
- not_work();
- }
-
- /*----------------------------*/
- do_play()
- {
- if (cmd.nn==o_cube)
- do_roll();
-
- else if (cmd.nn==o_disk)
- prints("You need something to play it.");
-
- else if (cmd.nn==o_proj)
- do_use();
-
- else
- not_happen();
- }
-
- /*----------------------------*/
- do_insert()
- {
- v_word noun;
- int nn;
-
- if (cmd.nn==o_sing)
- {
- nn = InputNoun( "Where? ", noun );
- if ( (!strcmp(noun,"groo") || !strcmp(noun,"band") || nn==o_audio)
- && ObjIsPresent(o_audio) )
- {
- af = 1;
- JunkObj( cmd.nn );
- prints("The singularity slides in with a click.");
- }
- else
- not_work();
- }
-
- else if (cmd.nn==o_disk)
- {
- nn = InputNoun( "Where? ", noun );
- if ( (!strcmp(noun,"slot") || nn==o_proj) && ObjIsPresent(o_proj) )
- {
- obj[cmd.nn].loc = -7;
- ok();
- }
- else
- not_work();
- }
-
- else
- not_work();
- }
-
- /*----------------------------*/
- do_fix()
- {
- if (cmd.nn==o_proj)
- prints("You don't know how to properly fix such a delicate instrument.");
-
- else
- prints("You don't know how.");
- }
-
- /*----------------------------*/
- do__y_()
- {
- if (!ObjIsPresent(o_appa))
- PrintMess( 7 );
-
- else switch ( cmd.nn )
- {
- case o_cube:
- if (dr<3)
- prints("You shouldn't do that yet.");
- else
- {
- prints("The hexahedron expands one dimension.");
- ReplaceObj( cmd.nn, o_solid );
- }
- break;
-
- case o_tetra:
- prints("It expands a dimension, but quickly collapses back.");
- break;
-
- case o_strip:
- prints("The moebius strip expands one dimension.");
- ReplaceObj( cmd.nn, o_bottle );
- break;
-
- case o_prism:
- prints("Object too unstable.");
- break;
-
- case o_bottle:
- case o_solid:
- case o_liquid:
- prints("Can't go any higher in this universe.");
- break;
-
- case o_appa:
- prints("Sorry, can't upgrade a product this way.");
- break;
-
- case o_plant:
- prints("The being is already high enough.");
- break;
-
- default:
- not_happen();
- }
- }
-
- /*----------------------------*/
- do_prove()
- {
- v_word noun;
- char *msg1;
- int nn;
-
- msg1 = "Somehow a contradiction keeps coming into the proof.";
-
- switch ( cmd.nn )
- {
- case o_lemma:
- case o_theorem:
- case o_axiom:
- case o_post:
- prints("It's already proven.");
- break;
-
- case o_supp:
- nn = InputNoun( "With what? ", noun );
- if (nn==o_post && ObjIsPresent(o_post))
- {
- if (ObjIsPresent(o_contra))
- prints( msg1 );
- else
- {
- prints("The postulate is now a lemma.");
- ReplaceObj( cmd.nn, o_lemma );
- }
- }
- else
- not_work();
- break;
-
- case o_hypo:
- nn = InputNoun( "With what? ", noun );
- if (nn==o_lemma && ObjIsPresent(o_lemma) && ObjIsPresent(o_axiom))
- {
- if (ObjIsPresent(o_contra))
- prints( msg1 );
- else
- {
- prints("The hypothesis is now a theorem.");
- ReplaceObj( cmd.nn, o_theorem );
- prints("Suddelnly, a hyper-spatial cliff passes by");
- prints("and the lemma leaps to its demise.");
- JunkObj( o_lemma );
- }
- }
- else
- prints("Hmmm, something seems to be missing from the proof.");
- break;
-
- case o_idea:
- prints("The idea developed into a contradiction.");
- ReplaceObj( cmd.nn, 52 );
- break;
-
- case o_contra:
- prints("You proved that the contradiction can't be proven.");
- break;
-
- default:
- not_poss();
- }
- }
-
- /*----------------------------*/
- do_smell()
- {
- prints("You smell nothing unusual.");
- }
-
- /*----------------------------*/
- do_close()
- {
- not_poss();
- }
-
- /*----------------------------*/
- do_open()
- {
- not_poss();
- }
-
- /*----------------------------*/
- do_stop()
- {
- if (!strcmp(cmd.sh_noun,"slee") || !strcmp(cmd.sh_noun,"drea"))
- do_wake();
-
- else if (!strcmp(cmd.sh_noun,"read"))
- {
- if (InBookWorld( curr_loc ))
- {
- goto_new_lev( 1 );
- print_room = 1;
- ok();
- }
- else
- prints("Reality is like a book that you can't stop reading.");
- }
- else
- not_work();
- }
-
- /*----------------------------*/
- do_say()
- {
- cprintf( "'%s'", cmd.noun ); nl();
- if (gp==0)
- not_happen();
-
- else
- {
- if (strcmp( cmd.noun,"tesseract" ))
- zap = 2; /* wrong password */
- else
- zap = 3; /* right password */
- }
- }
-
- /*----------------------------*/
- do_quit()
- {
- do_score();
- zap = 1;
- }
-
- /*----------------------------*/
- do_help()
- {
- if (cmd.nn>0)
- how();
-
- else if (curr_lev==2)
- prints("Use 'wake' to wake up from your dream.");
-
- else if (curr_lev==3)
- prints("Use 'stop reading' to stop reading the adventure.");
-
- else
- prints("Sorry, quasi-hyper-neo-mathematics is beyond me.");
- }
-
- /*----------------------------*/
- do_listen()
- {
- char *msg;
-
- msg = "Of Countless Tesseracts";
-
- if (curr_loc==19)
- prints("Sounds like radio waves from the Creation.");
-
- else if (curr_loc!=obj[o_plant].loc)
- prints("You hear nothing special.");
-
- else if (wa==0)
- prints("The being is whispering too softly.");
-
- else if (!WearingObj(o_audio))
- prints("You hear a harmonic song in a strange language.");
-
- else if (!af)
- {
- cprintf("You hear an %d-voiced fugue in a complex 1/f melody.", sum); nl();
- prints("But you are unable to follow even a single voice.");
- }
-
- else
- {
- cprintf("You hear the words: %s.", msg ); nl();
- mi = mi | 8;
- }
- }
-
- /*----------------------------*/
- do_save()
- {
- int i;
- FILE *f;
- char s[80];
-
- cprintf("Filename to save game to: ");
- gets( s );
- if (!*s) return;
-
- f=fopen(s,"w");
- if (f)
- {
- for ( i=1; i<MaxObjs; i++ )
- fprintf( f, "%d ", obj[i].loc );
-
- fprintf( f, "%d %d %d %d %d %d ",
- curr_lev, curr_loc,
- level_loc[1], level_loc[2], level_loc[3], sleep_lev );
-
- fprintf( f, "%d %d %d %d %d %d %d %d %d %d %d %d ",
- cc, wa, ep, dr, af, gp, mi, ti, kp, dc[0], dc[1], dc[2] );
-
- putc( '\n', f );
- fclose( f );
- prints("Game saved.");
- }
- else
- {
- cprintf("Unable to save game to %s", s); nl();
- }
- }
-
- /*----------------------------*/
- do_load()
- {
- int i;
- FILE *f;
- char s[80];
-
- cprintf("Filename to load game from: ");
- gets( s );
- if (!*s) return;
-
- f=fopen(s,"r");
- if (f)
- {
- for ( i=1; i<MaxObjs; i++ )
- fscanf( f, "%d ", &obj[i].loc );
-
- fscanf( f, "%d %d %d %d %d %d ",
- &curr_lev, &curr_loc,
- &level_loc[1], &level_loc[2], &level_loc[3], &sleep_lev );
-
- fscanf( f, "%d %d %d %d %d %d %d %d %d %d %d %d ",
- &cc, &wa, &ep, &dr, &af, &gp, &mi, &ti, &kp, &dc[0], &dc[1], &dc[2] );
-
- for ( sum=0, i=0; i<3; i++ )
- sum += dc[i];
-
- fclose( f );
- prints("Game loaded.");
- print_room = 1;
- }
- else
- {
- cprintf("Unable to load game from %s", s); nl();
- }
- }
-
- /*----------------------------*/
- do_score()
- {
- cprintf("You scored %d out of 15.", mi ); nl();
- }
-
- /*----------------------------*/
- do_sleep()
- {
- if (InDreamWorld( curr_loc ))
- {
- prints("A dream within a dream would have been quite poetic,");
- prints("But time did not allow for it.");
- }
-
- else if (ep==0)
- prints("You're not sleepy yet.");
-
- else
- {
- prints("As you sleep, you begin to have a strange dream ...");
- sleep_lev = curr_lev;
- goto_new_lev( 2 );
- print_room = 1;
- }
- }
-
- /*----------------------------*/
- do_wake()
- {
- if (cmd.nn!=o_math && cmd.nn>0)
- not_work();
-
- else if (!InDreamWorld( curr_loc ))
- prints("Reality is not a fragment of nightmares and dreams.");
-
- else if (cmd.nn!=o_math)
- {
- prints("Wow, that was some dream.");
- goto_new_lev( sleep_lev );
- print_room = 1;
- }
-
- else
- {
- if (!ObjInRoom(o_theorem))
- prints("He mumbles: bother me not, I'm contemplating the ultimate question");
- else
- {
- prints("He wakes up, looks at the theorem, an shouts:");
- prints("Eureka! This proves that the universe doesn't exis...");
- goto_new_loc( 35 );
- print_room = 1;
- mi = mi | 4;
- }
- }
- }
-
- /*----------------------------*/
- do_give()
- {
- int nn;
- v_word noun;
-
- nn = InputNoun( "To whom? ", noun );
- if (!nn)
- not_work();
-
- else if (!ObjIsPresent(nn))
- not_yet();
-
- else if (nn==o_math)
- {
- if (cmd.nn==o_theorem)
- {
- DropObj( cmd.nn );
- cmd.nn=o_math;
- do_wake();
- }
- else
- prints("He mumbles: disturb me not with such unimportant things.");
- }
-
- else if (nn==o_plant)
- {
- if (cmd.nn==o_liquid)
- how();
- else if (cmd.nn==o_solid)
- prints("Plants don't eat solid nutrients.");
- else
- prints("The being doesn't need that.");
- }
-
- else
- not_work();
- }
-
- /*----------------------------*/
- int stack_say( char *s )
- {
- cprintf("Stack: ");
- if (*s) prints( s );
- return( 1 );
- }
-
- do_scan()
- {
- char *s;
- int flag;
-
- s = "stack potential non-zero, pushing allowed.";
- flag = 0;
-
- if (!ObjOnPlayer(o_stack))
- PrintMess( 7 );
-
- else if (gp)
- {
- prints("Something has rendered the stack inoperative.");
- return;
- }
-
- else if (cmd.nn==0)
- {
- if (InMirrorWorld( curr_loc ) || InMathWorld( curr_loc ) ||
- InSpectralWorld( curr_loc ))
- flag = stack_say("stack level non-zero, popping allowed.");
-
- if (curr_loc<=3)
- flag = stack_say( s );
-
- if (curr_loc==18)
- flag = stack_say("magnetic field present.");
-
- if (curr_loc==obj[o_plant].loc)
- flag = stack_say("sonic harmony present.");
-
- if (curr_loc==16)
- flag = stack_say("field certainty probably not stable");
-
- if (!flag)
- stack_say("nothing special to report.");
- }
-
- else
- {
- stack_say( "" );
- switch ( cmd.nn )
- {
- case o_mirror:
- case o_crt:
- case o_hole:
- prints( s );
- break;
-
- case o_plant:
- cprintf("4-D. ");
- if (!wa)
- prints("dehydrated. weak audio output.");
- else
- prints("healthy. strong audio output.");
- break;
-
- case o_stack:
- prints("Stack operational.");
- break;
-
- case o_audio:
- if (!af)
- prints("no filter.");
- else
- prints("filter active.");
- break;
-
- case o_pills:
- prints("edible. barbiturate.");
- break;
-
- case o_fluid:
- prints("extremely cold. superconductive. superfluid.");
- break;
-
- case o_prism:
- prints("brittle. light sensitive.");
- break;
-
- case o_coil:
- prints("composition = yttrium, barium, copper, oxygen.");
- if (cc)
- {
- cprintf("Stack: properties = ");
- if (cc & 1) cprintf("superconductive. ");
- if (cc & 2) cprintf("magnetic. ");
- if ((cc & 3)==3) cprintf("strong magnetic field present.");
- nl();
- }
- break;
-
- case o_plasma:
- prints("extremely hot.");
- break;
-
- case o_solid:
- prints("4-D. solid.");
- break;
-
- case o_liquid:
- prints("4-D. liquid.");
- break;
-
- case o_tetra:
- prints("color sensitive. omni-stable.");
- break;
-
- default:
- prints("nothing special to report.");
- break;
-
- } /* switch */
- } /* else */
- }
-
- /*----------------------------*/
- do_solve()
- {
- int nn;
- v_word noun;
-
- if (cmd.nn==o_zeta)
- {
- nn = InputNoun("With what? ", noun );
- if (!nn)
- not_work();
-
- else if (!ObjIsPresent(nn))
- not_yet();
-
- else if (nn!=o_func)
- prints("Not difficult, although for someone like you it's too still hard.");
-
- else
- {
- prints("The function and the integral cancel out nicely");
- prints("and everything is reduced to a singularity.");
- ReplaceObj( cmd.nn, o_sing );
- JunkObj( o_func );
- }
- }
-
- else if (cmd.nn==o_func)
- prints("You are not really into great episodes of frustration.");
-
- else if (cmd.nn==o_improb)
- prints("It's improbable that you can solve it.");
-
- else
- not_work();
- }
-
- /*----------------------------*/
- do_think()
- {
- if (!InDreamWorld(curr_loc))
- prints("Therefore you are.");
-
- else if (curr_loc!=25)
- prints("This is not a good place to think.");
-
- else if (!ti)
- {
- prints("You thought of an idea.");
- CarryObj( o_idea );
- ti = 1;
- }
-
- else
- prints("You are out of ideas.");
- }
-
- /*----------------------------*/
- do_burn()
- {
- if (!ObjIsPresent(o_plasma))
- not_yet();
-
- else
- prints("Don't be a pyromaniac.");
- }
-
- /*----------------------------*/
- do_evap()
- {
- if (!ObjIsPresent(o_plasma))
- not_yet();
-
- else if (cmd.nn==o_fluid)
- {
- prints("The fluid evaporates.");
- JunkObj( cmd.nn );
- }
-
- else
- do_burn();
- }
-
- /*----------------------------*/
- do_climb()
- {
- if (cmd.nn==o_plant)
- prints("That isn't very polite, and besides, it's not a beanstalk.");
-
- else if (cmd.nn==o_mount)
- prints("There are no rivers on the mountain.");
-
- else
- not_poss();
- }
-
- /*----------------------------*/
- do_cut()
- {
- switch( cmd.nn )
- {
- case o_prism:
- prints("It's already pre-cut.");
- break;
-
- case o_tetra:
- prints("It is easily cut, but the cuts immediately reseal themselves.");
- break;
-
- case o_strip:
- prints("With some tricky cuts, you end up with a mobius strip again.");
- break;
-
- case o_bottle:
- prints("The bottle breaks into a mobius strip.");
- ReplaceObj( cmd.nn, o_strip );
- if (obj[o_liquid].loc==-8)
- {
- prints("The liquid in the bottle falls to the ground.");
- DropObj( o_liquid );
- if (curr_loc==obj[o_plant].loc)
- {
- cmd.nn=o_plant;
- do_water();
- }
- }
- break;
-
- case o_plant:
- case o_solid:
- case o_liquid:
- prints("Such low dimension cuts has no effect.");
- break;
-
- default:
- not_work();
- }
- }
-
- /*----------------------------*/
- do_join()
- {
- if (cmd.nn==o_group)
- prints("You're too finite.");
- else
- not_poss();
- }
-
- /*----------------------------*/
- do_sing()
- {
- if (curr_loc==obj[o_plant].loc)
- prints("Your singing can't possible compete with the hyper-melody.");
-
- else
- not_happen();
- }
-
- /*----------------------------*/
- /*
- */
- DoCommand()
- {
- if (cmd.vn<=6
- || (cmd.vn>=39 && cmd.vn<=48) || cmd.vn==50 || cmd.vn==52
- || cmd.vn==58 )
- goto branch; /* noun-less verbs */
-
- if (cmd.nn==0) /* no noun given */
- {
- if (cmd.vn==11) /* special case for cmd="look" */
- goto branch;
- else
- {
- cprintf("%s what?", cmd.verb ); nl();
- return;
- }
- }
-
- if (obj[cmd.nn].loc==-9)
- {
- prints("Be more specific in naming the object");
- return;
- }
-
- if (!ObjIsPresent(cmd.nn))
- {
- prints("That object is not here.");
- return;
- }
-
- branch:
- switch ( cmd.vn )
- {
- case 1:
- case 2:
- case 3:
- case 4: do_dir(); break;
- case 5: do_inv(); break;
- case 6: do_go(); break;
- case 7: do_get(); break;
- case 8: do_drop(); break;
- case 9: do_throw(); break;
- case 10: do_break(); break;
- case 11: do_look(); break;
- case 12: do_read(); break;
- case 13: do_use(); break;
- case 14: do_touch(); break;
- case 15: do_swing(); break;
- case 16: do_rub(); break;
- case 17: do_push(); break;
- case 18: do_pop(); break;
- case 19: do_spin(); break;
- case 20: do_roll(); break;
- case 21: do_wear(); break;
- case 22: do_eat(); break;
- case 23: do_taste(); break;
- case 24: do_drink(); break;
- case 25: do_remove(); break;
- case 26: do_water(); break;
- case 27: do_fill(); break;
- case 28: do_pour(); break;
- case 29: do_freeze(); break;
- case 30: do_melt(); break;
- case 31: do_play(); break;
- case 32: do_insert(); break;
- case 33: do__y_(); break;
- case 34: do_prove(); break;
- case 35: do_fix(); break;
- case 36: do_smell(); break;
- case 37: do_close(); break;
- case 38: do_open();break;
- case 39: do_stop(); break;
- case 40: do_say(); break;
- case 41: do_quit(); break;
- case 42: do_help(); break;
- case 43: do_listen(); break;
- case 44: do_save(); break;
- case 45: do_load(); break;
- case 46: do_score(); break;
- case 47: do_sleep(); break;
- case 48: do_wake(); break;
- case 49: do_give(); break;
- case 50: do_scan(); break;
- case 51: do_solve(); break;
- case 52: do_think(); break;
- case 53: do_burn(); break;
- case 54: do_evap(); break;
- case 55: do_climb(); break;
- case 56: do_cut(); break;
- case 57: do_join(); break;
- case 58: do_sing(); break;
- default: cprintf( "I don't know how to %s.", cmd.verb ); nl();
- }
- }
-
- /*----------------------------*/
- Ending( int n )
- {
- switch ( n )
- {
- case 1:
- prints("Game Over");
- break;
-
- case 2:
- prints("Incorrect password.");
- prints("Self-destruct aborted. Resuming Doomsday countdown.");
- prints("5\n4\n3\n2\n1\n\nEarth destro...");
- break;
-
- case 3:
- prints("Correct password.");
- prints("Self-destruct sequence completed. Overriding Doomsday countdown.");
- prints("5\n4\n3\n2\n1\n\nKaboom...");
-
- if (!ObjIsPresent(24))
- {
- prints("The Doomsday complex is destroyed.\n");
- prints("You have given your life to save Earth. Thank you.");
- }
- else
- {
- prints(
- "As the complex disintegrates around you, the stack, sensing your\n"
- "danger, overloads all it's circuits to regain a moment's control.\n"
- "With a final burst of energy, the stack implodes, projecting a\n"
- "stasis field around you that protects you from the destruction.\n"
- "...\n"
- "From the smoldering debris of the Doomsday complex you pick up the\n"
- "pieces of the stack and reflect on how as you risked your life to\n"
- "save Earth, the stack has given its own to save yours. As you walk\n"
- "away, you solemnly swear to repair the stack, for the adventures that\n"
- "lie ahead.\n"
- );
- }
- break;
- }
- }
-
- /*----------------------------*/
- /*
- */
- intro1()
- {
- prints(" /*--------------/* ------------------------------------");
- prints(" / ' / ' Beyond The Tesseract V2.03 ");
- prints(" / '| / '| ");
- prints(" */----'---------*/ ' | An abstract text adventure ");
- prints(" '| ' | '| ' | ------------------------------------");
- prints(" ' | ' | ' | ' | This adventure is free software. ");
- prints(" ' | ' /*----'--|--'---/* If you like this program, hate it, ");
- prints(" ' | ' / ' ' | ' / ' or really don't care at all, then ");
- prints(" ' |' / ' ' |' / ' I would be happy to hear from you. ");
- prints(" ' /*/----'---'----/*/ ' ");
- prints(" ' / ' ' ' / ' ' David Lo ");
- prints("' / '| ' ' / '| ' 4516 Albert St. ");
- prints("*/----'----'----*/ ' | ' Burnaby, B.C., Canada ");
- prints("| ' | ' | ' | ' V5C 2G5 ");
- prints("| ' |' | ' | email c/o: dlo@idacom.cs.ubc.ca ");
- prints("| ' /*-------|--'---/*' ");
- prints("| ' / | ' / Please share unmodified copies of ");
- prints("|' / |' / this adventure with everyone. ");
- prints("*/--------------*/ ------------------------------------");
- prints(" (C) 1990 David Lo ");
- }
-
- intro()
- {
- int i,j,k;
-
- clrscr();
- intro1();
- prints("Press <Enter> to continue");
- i=get_enter();
- clrscr();
-
- prints("Scenario:");
- prints(" You have reached the final part of your mission. You have gained access");
- prints(" to the complex, and all but the last procedure has been performed. Now");
- prints(" comes a time of waiting, in which you must search for the hidden 12-word");
- prints(" message that will aid you at the final step. But what choice will you");
- prints(" make when that time comes?");
-
- prints("");
- prints("Instructions:");
- prints(" This adventure recognizes the standard commands for moving (N,E,S,W),");
- prints(" taking inventory (I), maninpulating objects (GET, DROP, LOOK), and");
- prints(" saving games (SAVE, LOAD), as well as many others. Use 2-word 'verb noun'");
- prints(" commands, such as 'use stack' or 'get all'. Only the first four letters");
- prints(" of each word are significant. The adventure recognizes about 200 words,");
- prints(" so if one word doesn't work, try another.");
-
- prints("");
- prints("Happy adventuring!");
- prints("");
-
- prints("Press <Enter> to begin");
- j=get_enter();
- clrscr();
- srand( i*i + j + k );
- }
-
- /*------------------------------------------------------------*/
- main()
- {
- int i, keep_playing;
-
- intro();
-
- do
- {
- InitAdv();
- clrscr(); gotoxy( 1,25 );
-
- do
- {
- gp = InComplex(curr_loc) && (mi==15);
-
- #ifdef tty
- if (print_room)
- {
- PrintCurrRoom();
- print_room=0;
- }
- #endif
-
- if (gp)
- prints("A voice echoes: audio link complete. Enter password.");
-
- #ifndef tty
- PrintCurrRoom();
- #endif
-
- if (InDreamWorld( curr_loc ))
- printf("(sleeping) ");
- else if (InBookWorld( curr_loc ))
- printf("(reading) ");
-
- cprintf("Enter command: ");
- gets( cmd.cm );
- if (cmd.cm[0])
- {
- AnalyseCommand( &cmd );
- DoCommand();
- nl();
- }
- }
- while ( !zap );
-
- Ending( zap );
- nl();
- cprintf("Play again (y/n)? ");
- gets( cmd.cm );
- keep_playing = (tolower(cmd.cm[0])!='n');
- nl();
- }
- while ( keep_playing );
- clrscr();
- }
-